home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 141 / Gekkan Dennou Club - 2000.2 Vol. 141 (Japan) (Track 1).bin / docs / asm / slowdown.s < prev    next >
Encoding:
Text File  |  2000-01-10  |  3.3 KB  |  149 lines

  1. ;----------------------------------------------------------------
  2. ;超低速スムーススクロールダウン
  3. ;    テキストの上から30行を2ドットずつスムーススクロールダウンします
  4. ;    ESCで終了します
  5.  
  6.     .include    doscall.mac
  7.     .include    iocscall.mac
  8.  
  9. ;----------------------------------------------------------------
  10. ;ラスタコピーマクロ
  11. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  12. ;<dn.w:ソースラスタブロック番号*$0100+デスティネーションラスタブロック番号が
  13. ;    入っているレジスタ
  14. ;<sn.w:srを保存してあるレジスタ
  15. RASCPY    .macro    an,dn,sn
  16. @_1:    tst.b    (a0)            ;水平帰線期間を待つ
  17.     bmi    @_1
  18.     ori.w    #$0700,sr        ;割り込み禁止
  19. @_2:    tst.b    (a0)            ;水平表示期間を待つ
  20.     bpl    @_2
  21.     move.w    dn,($00E8002C-$00E88001,an)    ;ラスタブロック番号を設定
  22.     move.w    #8,($00E80480-$00E88001,an)    ;ラスタコピー実行
  23.     move.w    sn,sr            ;割り込み許可
  24.     .endm
  25.  
  26. ;----------------------------------------------------------------
  27. ;ラスタコピー終了マクロ
  28. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  29. RASEND    .macro    an
  30. @_1:    tst.b    (a0)            ;水平帰線期間を待つ
  31.     bmi    @_1
  32. @_2:    tst.b    (a0)            ;水平表示期間を待つ
  33.     bpl    @_2
  34.     move.w    #$0000,($00E80480-$00E88001,a0)    ;ラスタコピー終了(clrは避ける)
  35.     .endm
  36.  
  37. ;----------------------------------------------------------------
  38. ;次の垂直帰線期間を待つマクロ
  39. ;<an.l:$00E88001に固定してあるアドレスレジスタ
  40. VSYNC    .macro    an
  41. @_1:    btst.b    #4,(a0)            ;垂直表示期間を待つ
  42.     beq    @_1
  43. @_2:    btst.b    #4,(a0)            ;垂直帰線期間を待つ
  44.     bne    @_2
  45.     .endm
  46.  
  47. ;----------------------------------------------------------------
  48. ;----------------------------------------------------------------
  49. ;メインルーチン
  50.  
  51. ;スーパーバイザモードへ移行
  52.     clr.l    -(sp)
  53.     DOS    _SUPER
  54.     move.l    d0,(sp)
  55.  
  56. ;カーソル消去
  57.     IOCS    _B_CUROFF
  58.  
  59.     move.w    $00E8002A,-(sp)
  60.  
  61. ;表の上30行を裏へコピー(下へ2ドットずらす)
  62.     move.w    #$0000,$00E8002A
  63.     lea.l    $00E00000,a0
  64.     lea.l    $00E10100,a1
  65.     lea.l    $00E20000,a2
  66.     lea.l    $00E30100,a3
  67.     move.w    #($800*30-$100)/256-1,d7
  68. 7:
  69. n = 0
  70.   .rept 7
  71.     movem.l    (a0)+,d0-d6/a4-a5
  72.     movem.l    d0-d6/a4-a5,(n,a1)
  73.     movem.l    (a2)+,d0-d6/a4-a5
  74.     movem.l    d0-d6/a4-a5,(n,a3)
  75. n = n+36
  76.   .endm
  77.     move.l    (a0)+,(36*7,a1)
  78.     move.l    (a2)+,(36*7,a3)
  79.     lea.l    (256,a1),a1
  80.     lea.l    (256,a3),a3
  81.     dbra    d7,7b
  82.     lea.l    $00E10000,a1
  83.     lea.l    $00E30000,a3
  84. n = 0
  85.   .rept 7
  86.     movem.l    (a0)+,d0-d6/a4-a5
  87.     movem.l    d0-d6/a4-a5,(n,a1)
  88.     movem.l    (a2)+,d0-d6/a4-a5
  89.     movem.l    d0-d6/a4-a5,(n,a3)
  90. n = n+36
  91.   .endm
  92.     move.l    (a0)+,(36*7,a1)
  93.     move.l    (a2)+,(36*7,a3)
  94.  
  95. ;2ドットずつスムーススクロールダウン
  96.     lea.l    $00E88001,a0        ;$00E88001に固定
  97.     move.w    #%0011,($00E8002A-$00E88001,a0)    ;ラスタコピープレーンセレクト
  98.     move.w    sr,d3            ;srを保存
  99.     move.b    #$F8,d4            ;ラスタブロック248
  100. loop:
  101.     VSYNC    a0            ;次の垂直帰線期間を待つ
  102.     clr.b    d5            ;ラスタブロック0
  103.     moveq.l    #120-1,d6
  104. 6:    move.b    d5,d0            ;表→裏
  105.     lsl.w    #8,d0
  106.     move.b    d4,d0
  107.     RASCPY    a0,d0,d3
  108.     addq.b    #1,d4
  109.     cmp.b    #$F8,d4
  110.     bls    @f
  111.     move.b    #$80,d4
  112. @@:
  113.     move.b    d4,d0            ;裏→表
  114.     lsl.w    #8,d0
  115.     move.b    d5,d0
  116.     RASCPY    a0,d0,d3
  117.     addq.b    #1,d5
  118.     dbra    d6,6b
  119.     move.b    d4,d0
  120.     subq.b    #1,d4
  121.     bmi    @f
  122.     move.b    #$F8,d4
  123. @@:    lsl.w    #8,d0
  124.     move.b    d4,d0
  125.     ror.w    #8,d0
  126.     RASCPY    a0,d0,d3
  127.     RASEND    a0
  128.     btst.b    #1,$0800.w        ;ESCキーチェック
  129.     beq    loop
  130.  
  131.     move.w    (sp)+,$00E8002A
  132.  
  133. ;キーバッファフラッシュ
  134.     bra    2f
  135. 1:    IOCS    _B_KEYINP
  136. 2:    IOCS    _B_KEYSNS
  137.     tst.l    d0
  138.     bne    1b
  139.  
  140. ;カーソル表示
  141.     IOCS    _B_CURON
  142.  
  143. ;ユーザモードに復帰
  144.     DOS    _SUPER
  145.     addq.l    #4,sp
  146.  
  147. ;終了
  148.     DOS    _EXIT
  149.